package org.example.classtopia.Controller;

import org.example.classtopia.Common.Result.Result;
import org.example.classtopia.Mapper.PostMapper;
import org.example.classtopia.Mapper.UserMapper;
import org.example.classtopia.Mapper.UserMassageMapper;
import org.example.classtopia.Model.Entity.UserMessage;
import org.example.classtopia.Model.dto.CommentCreateDTO;
import org.example.classtopia.Model.dto.CommentStatusUpdateDTO;
import org.example.classtopia.Model.Entity.Comment;
import org.example.classtopia.Model.Entity.User;
import org.example.classtopia.Service.CommentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 评论管理接口 - 简化版
 * 
 * 提供四个核心功能：
 * 1. 创建评论
 * 2. 查询帖子评论列表（分页）
 * 3. 修改评论状态
 * 4. 根据ID查询评论
 */
@RestController
@RequestMapping("/comments")
public class CommentController {

    @Autowired
    private CommentService commentService;

    @Autowired
    private UserMassageMapper userMassageMapper;

    @Autowired
    private UserMapper userMapper;
    @Autowired
    private PostMapper postMapper;

    /**
     * 1. 创建评论
     * 
     * 前端需要传递：
     * - postId: 被评论的帖子ID
     * - userId: 评论用户ID
     * - nickname: 评论用户昵称
     * - avatar: 评论用户头像
     * - content: 评论内容
     * 
     * @param commentCreateDTO 评论创建参数
     * @return 创建成功返回200
     */
    @PostMapping
    public Result<String> createComment(@RequestBody CommentCreateDTO commentCreateDTO) {
        // 参数验证
        if (commentCreateDTO.getPostId() == null) {
            return Result.error(400, "帖子ID不能为空");
        }
        if (commentCreateDTO.getUserId() == null) {
            return Result.error(400, "用户ID不能为空");
        }
        if (!StringUtils.hasText(commentCreateDTO.getContent())) {
            return Result.error(400, "评论内容不能为空");
        }

        try {
            // 根据userId获取用户信息
            User user = userMapper.FindCommonData(commentCreateDTO.getUserId());
            if (user == null) {
                return Result.error(400, "用户不存在");
            }

            // 创建评论实体
            Comment comment = new Comment();
            comment.setPostId(commentCreateDTO.getPostId());
            comment.setUserId(commentCreateDTO.getUserId());
            comment.setNickname(user.getNickname());
            comment.setAvatar(user.getAvatar());
            comment.setContent(commentCreateDTO.getContent());
            comment.setStatus(0);
            comment.setLikeCount(0);
            comment.setCreateTime(LocalDateTime.now());

            // 调用服务层创建评论
            int result = commentService.createComment(comment);
            if (result > 0) {
                // 新增：评论数+1
                postMapper.incrementCommentCount(commentCreateDTO.getPostId());
                UserMessage userMessage = new UserMessage();
                userMessage.setCommentId(comment.getId());
                userMessage.setUserId(postMapper.getUserIdByPostId(commentCreateDTO.getPostId()));
                userMessage.setPostId(commentCreateDTO.getPostId());
                userMessage.setContent("用户  "
                        + userMapper.FindDataByID(Math.toIntExact(commentCreateDTO.getUserId())).getNickname()
                        + "  评论了你的帖子:" + org.apache.commons.lang3.StringUtils.abbreviate(comment.getContent(), 50));

                userMessage.setMessageType("comment");
                userMessage.setIsRead(0);
                userMessage.setTime(comment.getCreateTime());
                userMassageMapper.InsertUserMessage(userMessage);
                return Result.success("评论创建成功");
            } else {
                return Result.error(500, "评论创建失败");
            }
        } catch (Exception e) {
            return Result.error("服务器内部错误：" + e.getMessage());
        }
    }

    /**
     * 2. 查询帖子评论列表（分页）
     * 
     * 前端需要传递：
     * - postId: 要查询的帖子ID
     * - page: 页码（从0开始）
     * - size: 每页数量
     * 
     * 后端返回：评论ID、userID、用户昵称、用户头像、评论内容
     * 
     * @param postId 帖子ID
     * @param page   页码
     * @param size   每页数量
     * @return 评论列表
     */
    @GetMapping("/post/{postId}")
    public Result<List<Comment>> getCommentsByPostId(@PathVariable Long postId,
            @RequestParam(defaultValue = "0") int page,
            @RequestParam(defaultValue = "10") int size) {
        try {
            List<Comment> comments = commentService.getCommentsByPostId(postId, page, size);
            return Result.success("查询成功", comments);
        } catch (Exception e) {
            return Result.error("服务器内部错误：" + e.getMessage());
        }
    }

    /**
     * 3. 修改评论状态
     * 
     * 前端需要传递：
     * - id: 要修改状态的评论ID
     * - status: 要修改的状态（0-正常，1-删除）
     * 
     * @param commentStatusUpdateDTO 状态更新参数
     * @return 更新结果
     */
    @PutMapping("/status")
    public Result<String> updateCommentStatus(@RequestBody CommentStatusUpdateDTO commentStatusUpdateDTO) {
        if (commentStatusUpdateDTO.getId() == null) {
            return Result.error(400, "评论ID不能为空");
        }
        if (commentStatusUpdateDTO.getStatus() == null) {
            return Result.error(400, "状态不能为空");
        }
        if (commentStatusUpdateDTO.getStatus() != 0 && commentStatusUpdateDTO.getStatus() != 1) {
            return Result.error(400, "状态值只能是0（正常）或1（删除）");
        }

        try {
            int result = commentService.updateCommentStatus(
                    commentStatusUpdateDTO.getId(),
                    commentStatusUpdateDTO.getStatus());
            if (result > 0) {
                userMassageMapper.DeleteCommentUserMessage(commentStatusUpdateDTO.getId());
                return Result.success("状态更新成功");
            } else {
                return Result.error(500, "状态更新失败");
            }
        } catch (Exception e) {
            return Result.error("服务器内部错误：" + e.getMessage());
        }
    }

    /**
     * 4. 根据ID查询评论
     * 
     * 前端需要传递：
     * - id: 要查看的评论ID
     * 
     * 后端返回：该评论的全部信息
     * 
     * @param id 评论ID
     * @return 评论详情
     */
    @GetMapping("/{id}")
    public Result<Comment> getCommentById(@PathVariable Long id) {
        try {
            Comment comment = commentService.getCommentById(id);
            if (comment == null) {
                return Result.error(404, "评论不存在");
            }
            return Result.success("查询成功", comment);
        } catch (Exception e) {
            return Result.error("服务器内部错误：" + e.getMessage());
        }
    }
}
